#ifndef __HAVE_GHOSTS
#define __HAVE_GHOSTS

#include "renderer.h"
#include "constants.h"
#include "actor.h"

class Ghost:public Actor
{
public:
    static int scared_time;
    static int last_scared_at;
    static int blink_time;
    static int speed[];
    
protected:
    int state;
    int min_dots_to_enter_play;
    // На какво се връща призракът, когато се прероди или спре да е уплашен.
    int default_spriteset;
public:
    Ghost(int, int, Spritesheet *, int);
    void move();
    void draw(SDL_Surface * );
    int collision();
    
    void scare();
    void unscare();
    void become_eaten();
    void become_alive();
    
    void roadblock_callback();
    void set_state(int _state);
    // Това се използва от изядени призраци, които искат да се съживят.
    Tile home_tile();
    // Това се използва от призраци, излизащи от базата.
    Tile outside_home_tile();
    
    Tile target_tile();
    virtual Tile chase_tile() = 0;
    virtual Tile scatter_tile() = 0;
    
    // Това е виртуално, защото Блинки изчислява скоростта си различно от другите
    virtual int get_speed();
};


/*
 * Блинки винаги се опитва да стигне точно до Пакман.
 * Той е най-агресивният от всички призраци.
 * Прякорът му е "Сянката", защото винаги следва Пакман като сянка.
 * Когато на екрана останат малко точки Блинки се превръща в Cruise Elroy
 * (Никой не знае откъде идва това име). Елрой е забележимо по-бърз от
 * обикновен призрак.
 * */
class Blinky:public Ghost
{
    // Колко точки трябва да са останали на екрана, за да се появи Елрой.
    static int elroy_threshold_1;
    static int elroy_threshold_2;

public:
    Blinky(Spritesheet * sheet = NULL, int _x = 12*TILE_SIZE, int _y = 15*TILE_SIZE);
    Tile chase_tile();
    Tile scatter_tile();
    int get_speed();
};

/*
 * Пинки е втората най-голяма опасност за Пакман.
 * Неговата стратегия е да причаква героя ни. Прякорът му е "Дебнещия"
 * Стреми се да бъде няколко полета пред Пак в посоката, в която се движи.
 * Това може да бъде използвано срещу него.
 * В оригиналния Пакман има бъг, при който Пинки не се движи коректно ако Пакман гледа нагоре.
 * Тук този бъг не е включен.
 * */
class Pinky:public Ghost
{
public:
    Pinky(Spritesheet * sheet = NULL, int _x = 13*TILE_SIZE, int _y = 18*TILE_SIZE);
    Tile chase_tile();
    Tile scatter_tile();
};

/*
 * Инки е по-плах от братята си. Той прекарва повечето време
 * в опити да се *скрие* от Пакман! Но, ако Блинки е наблизо,
 * Инки проявява кураж и подгонва жълтия хищник!
 * Прякорът му е "Срамежливко".
 * */
class Inky:public Ghost
{
public:
    Inky(Spritesheet * sheet = NULL, int _x = 11*TILE_SIZE, int _y = 18*TILE_SIZE);
    Tile chase_tile();
    Tile scatter_tile();
};

/*
 * Клайд постоянно лети в облаците. Той е най-незаинтересованият от четирите призрака.
 * Всъщност, Клайд дори не се опитва да хване Пакман.
 * Единственият начин това да се случи е ако Пак случайно се блъсне в него!
 * Прякорът му е "Глупчото".
 * */
class Clyde:public Ghost
{
public:
    Clyde(Spritesheet * sheet = NULL, int _x = 15*TILE_SIZE, int _y = 18*TILE_SIZE);
    Tile chase_tile();
    Tile scatter_tile();
};

#endif
